因為在寫得當下其實還有蠻多前提知識不太理解的,所以實際結果跟自己的想法有不少出入,這邊先已記錄為主,之後慢慢修。
雖然雲看起來很單純,不過其實一朵雲就可以包含上百萬個粒子。除此之外還需要處理光線、密度、體積位置等等特別麻煩的計算。一般來說直接用 Skybox 的圖直接做成遠景是最省效能的方式。
不過這邊就是特別要這樣做來理解相關的技術,因為這些對以後如果要實作特效這類的 shader 還有優化都有幫助。例子如下
| 技術 | 對特效的用途 | 常見效果 |
|---|---|---|
| Noise / Value Noise | 製造自然的不規則變化 | 火焰、煙、霧、魔法、溶解 |
| FBM | 疊加不同尺度細節 | 雲、煙、火、地形、能量 |
| Density Field | 描述「空間中有多少東西」 | 雲、煙、霧、火、爆炸 |
| Ray Marching | 在 3D 空間中取樣效果 | 體積霧、雲、SDF、黑洞、能量體 |
| Beer-Lambert | 模擬光穿過介質被吸收 | 煙、霧、水、雲、玻璃感 |
| Light Marching | 計算體積內部陰影 | 雲、煙、爆炸 |
| Phase Function | 控制體積散射方向 | 雲、霧、God Ray |
| Height Mask | 控制效果垂直分布 | 地面霧、火焰、瀑布霧氣 |
| Coverage / Threshold | 控制效果出現多少 | 雲量、火焰區域、Dissolve |
當然這些計算就需要用到 Conpute shader 來加快計算的速度,這會是下一篇介紹的內容。
Real-time dreamy Cloudscapes with Volumetric Raymarching - The Blog of Maxime Heckel